/**
 * 
 */
package neptune.web.client.controller;

import neptune.web.client.model.SerializableUser;
import neptune.web.client.services.user.UserService;
import neptune.web.client.view.ConsoleManager;

import org.gwtlib.client.table.ContentProvider;
import org.gwtlib.client.table.Row;
import org.gwtlib.client.table.Rows;
import org.gwtlib.client.table.ui.Table;

import com.google.gwt.user.client.rpc.AsyncCallback;

/**
 * @author Roberto Bifulco [info@robertobifulco.it, robertobifulco.it]
 * 
 */
public class UserViewController implements ContentProvider {

	private Table table;

	/**
	 * @param table
	 */
	public UserViewController(Table table) {
		this.table = table;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.gwtlib.client.table.ContentProvider#load(int, int, int, boolean)
	 */
	/**
	 * Il metodo ha lo scopo di ottenere informazioni dal server per popolare la
	 * tabella. I parametri passati rappresentano le informazioni necessarie a
	 * recuperare l'insieme di dati richiesto dalla particolare pagina della
	 * tabella visualizzata.
	 * 
	 * 
	 */
	public void load(final int begin, int end, final int sortId,
			final boolean ascending) {
		ConsoleManager.addConsoleMessage("User table data loading started...",
				false);
		UserService.Util.getInstance().getUsers(begin, end, sortId, ascending,
				new AsyncCallback<SerializableUser[]>() {

					public void onSuccess(SerializableUser[] users) {
						table.onSuccess(UserToRows(users, begin, sortId,
								ascending));
						ConsoleManager.addConsoleMessage(
								"User table data loaded", false);
					}

					public void onFailure(Throwable arg0) {
						ConsoleManager.addConsoleMessage(
								"User table data load failed: " + arg0.getMessage(), true);

					}

				});
	}

	private Rows UserToRows(SerializableUser[] users, int begin, int sortId,
			boolean ascending) {

		// TODO da modificare quando si introducono nuove colonne alla tabella
		// degli utenti
		if (users != null) {
			Row[] rows = new Row[users.length];
			for (int i = 0; i < users.length; ++i) {
				rows[i] = new Row(i, new Object[] { users[i].getUsername(),
						users[i].getRole(), users[i].getEmail() });
			}
			return new Rows(rows, begin, sortId, ascending);
		}
		return new Rows(new Row[]{},0,0,false);
	}
}
